package com.loong.factory;

import com.loong.factory.utils.SubmodulePathFinderUtil;
import java.io.File;
import java.io.IOException;

/**
 * Logger类的抽象定义，用于日志记录功能
 * 它定义了日志记录的基本属性和方法，如日志文件的名称、路径和日志级别
 *
 * @author loongnoy
 * @version 1.0
 * @created 18-3月-2025 15:52:13
 */
public abstract class Logger {
    // 日志文件名，默认为"log"
    private String fileName;
    // 日志文件路径，默认为子模块路径下的logs目录
    private String filePath;
    // 日志级别，默认为"INFO"
    private String level;

    /**
     * 默认构造函数，初始化Logger对象
     * 设置默认的日志文件名、路径和日志级别
     */
    public Logger() {
        this.fileName = "log.log";
        try {
            // 使用工具类获取子模块路径，并拼接上"/logs"作为日志文件的路径
            this.filePath = SubmodulePathFinderUtil.getSubmodulePath() + "/logs";
        } catch (IOException e) {
            // 如果获取路径失败，抛出运行时异常
            throw new RuntimeException("无法获取子模块路径", e);
        }
        this.level = "INFO";
    }

    /**
     * 记录日志消息的方法，由子类具体实现
     *
     * @param message 要记录的日志消息
     */
    public abstract void log(String message);

    /**
     * 确保日志文件存在，如果不存在则创建
     * 这包括创建必要的父目录和日志文件本身
     */
    private void ensureFileExists() {
        File file = new File(filePath, fileName);

        // 检查文件是否存在
        if (!file.exists()) {
            // 确保父目录存在
            File parentDir = file.getParentFile();
            if (parentDir != null) {
                if (!parentDir.mkdirs() && !parentDir.exists()) {
                    // 如果创建父目录失败且目录不存在，抛出异常
                    throw new RuntimeException("无法创建日志文件的父目录: " + parentDir.getAbsolutePath());
                }
            }
            // 创建文件
            try {
                if (!file.createNewFile()) {
                    // 如果创建文件失败，抛出异常
                    throw new IOException("无法创建日志文件: " + file.getAbsolutePath());
                }
            } catch (IOException e) {
                // 如果创建文件时发生错误，抛出运行时异常
                throw new RuntimeException("创建日志文件时发生错误", e);
            }
        }
    }


    // 以下为getter和setter方法，用于获取和设置Logger的属性值
    public String getFileName() {
        return fileName;
    }

    public String getFilePath() {
        return filePath;
    }

    public String getLevel() {
        return level;
    }

    public void setFileName(String newVal) {
        fileName = newVal;
    }

    public void setFilePath(String newVal) {
        filePath = newVal;
    }

    public void setLevel(String newVal) {
        level = newVal;
    }
}
